Next:
Multithread-Safe, MT-Safe
, Previous:
E) Unit Test
, Up:
Index
Problem of Singleton
class
Database
{
public
:
virtual
int
get_population
(
const
std
::
string
&
name
)
=
0
;
}
;
class
SingletonDatabase
:
public
Database
{
SigletonDatabase
(
)
{
// ...
}
std
::
map
<
std
::
string
,
int
>
capitals
;
public
:
SingletonDatabase
(
SingletonDatabase
const
&
)
=
delete
;
void
operator
=
(
SigletonDatabase
const
&
)
=
delete
;
static
SigneltonDatabase
&
get
(
)
{
static
SigneltonDatabase
db
;
return
db
;
}
int
get_population
(
const
std
::
string
&
name
)
override
{
return
capitals
[
name
]
;
}
}
;
// SigletonDatabase
에
밀
접
하
게
의
존
하
는
SigneltonRecordFinder
클
래
스
struct
SigletonRecordFinder
{
int
total_population
(
std
::
vector
<
std
::
string
>
names
)
{
int
result
=
0
;
for
(
auto
&
name
:
names
)
result
+=
SingletonDatabase
::
get
(
)
.
get_population
(
name
)
;
return
result
;
}
}
;
싱글톤 구현에서 문제가 되는 부분은 다른 싱글턴 컴포턴트에서 또 다른 싱글턴을 사용할 때이다.
싱글톤 데이터베이스(SigletonDatabase)에 대한 명시적 의존성을 제거하기 위해,
데이터를 얻을 데이터베이스를 설정할 수 있는 ConfigurableRecordFinder 객체 정의
struct
ConfigurableRecordFinder
{
explicit
ConfigurableRecordFinder
(
Database
&
db
)
:
db
(
db
)
{
}
int
total_population
(
std
::
vector
<
std
::
string
>
names
)
{
int
result
=
0
;
for
(
auto
&
name
:
names
)
result
+=
db
.
get_population
(
name
)
;
return
result
;
}
}
;
위의 ConfigurableRecordFinder는 싱글톤 클래스에 의존하는 대신 참조 변수 db를 사용한다.